import {login, logout, refreshToken} from "@/api/auth"
import {PcCookie, Key} from "@/utils/cookie"

/**
 * 声明状态
 * @type {{userInfo: (any|null), accessToken, refreshToken}}
 */
const state = {
    // 用户基本信息：先从 cookie 里取，取到转化 json对象，没有取到返回 空
    userInfo: PcCookie.get(Key.userInfoKey) ? JSON.parse(PcCookie.get(Key.userInfoKey)) : null,
    accessToken: PcCookie.get(Key.accessTokenKey), // 访问令牌
    refreshToken: PcCookie.get(Key.refreshTokenKey) // 刷新令牌.当访问令牌过期,通过刷新令牌获取新的令牌
}

/**
 * 改变状态-向状态赋值
 * @type {{SET_USER_STATE(*, *), RESET_USER_STATE(*)}}
 */
const mutations = {

    // 赋值用户状态
    // 参数: state 获取状态属性名,data 接收数据传递给对应的状态
    SET_USER_STATE(state, data) {
        const {userInfo, access_token, refresh_token} = data
        // 状态赋值
        state.userInfo = userInfo
        state.accessToken = access_token
        state.refreshToken = refresh_token
        // 将数据保存到 cookie 中
        PcCookie.set(Key.userInfoKey, userInfo)
        PcCookie.set(Key.accessTokenKey, access_token)
        PcCookie.set(Key.refreshTokenKey, refresh_token)
    },

    // 重置用户状态
    RESET_USER_STATE(state) {

        // 重置状态(直接置空)
        state.userInfo = null
        state.accessToken = null
        state.refreshToken = null

        // 移除 cookie 中的数据
        PcCookie.remove(Key.userInfoKey)
        PcCookie.remove(Key.accessTokenKey)
        PcCookie.remove(Key.refreshTokenKey)
    }
}

/**
 * 定义行为
 * 专门操作 api 接口
 */
const actions = {
    // commit 主要是触发 mutations下的方法: commit('SET_USER_STATE', data) / commit('RESET_USER_STATE')
    // data 用来接收登录接口用户信息( 点击登录页面的登录按钮,会触发此登录方法,提交表单,响应数据)
    UserLogin({commit}, userData) {
        console.log('actions=>UserLogin', userData)
        const {username, password} = userData

        return new Promise((resolve, reject) => {

            login({username: username.trim(), password: password}).then(response => {
                console.log('actions=>response', response)
                const {code, data} = response
                if (code === 20000) {
                    // 状态用户赋值
                    commit('SET_USER_STATE', data)
                }
                resolve(response) // 正常响应的勾子
            }).catch(error => {
                // 重置用户状态(置空)
                commit('RESET_USER_STATE')
                reject(error) // 异常响应勾子
            })

        })
    },

    // 退出
    UserLogout({state, commit}, redirectURL) {
        // eslint-disable-next-line no-unused-vars
        logout(state.accessToken).then(response => {
            // 重置状态
            commit('RESET_USER_STATE')
            // 重定向回来源地址,如果没有指定来源地址,重定向回登录页
            window.location.href = redirectURL || '/'
            // eslint-disable-next-line no-unused-vars
        }).catch(error => {
            // 重置状态
            commit('RESET_USER_STATE')
            // 重定向回来源地址,如果没有指定来源地址,重定向回登录页
            window.location.href = redirectURL || '/'
        })

    },

    // 刷新令牌
    SendRefreshToken({state, commit}) {
        return new Promise((resolve, reject) => {

            // 判断是否有刷新令牌
            if (!state.refreshToken) {
                commit('RESET_USER_STATE') // 重置用户状态
                reject('没有刷新令牌')
                return
            }
            // 发送请求,刷新令牌
            refreshToken(state.refreshToken).then(response => {
                // 更新用户状态新数据
                commit('SET_USER_STATE', response.data)
                // resolve(response)  // 正常钩子,因为参数没用,所有不传递
                resolve()  // 正常钩子
            }).catch(error => {
                // 重置状态
                commit('RESET_USER_STATE')
                reject(error) // 异常
            })
        })
    }
}

// 导出对象才可以使用
export default {
    state,
    mutations,
    actions
}
